package jdbc.statement_;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * @author DCSGO
 * @version 1.0
 * Statement 注入问题
 */
/*
1.Statement对象用于执行静态SQL语句并返回其生成的结果的对象
2.在连接建立后，需要对数据库进行访问，执行命名或是SQL语句，可以通过
  Statement[存在SQL注入]
  PreparedStatement[预处理]
  CallableStatement[存储过程]
3.Statement对象执行SQL语句，存在SQL注工风险
4.SQL注入是利用某些系统没有对用户输入的数据进行充分的检查，而在用户输
  入数据中注入非法的SQL语句段或命令，恶意攻击数据库。
5．要防范SQL注入，只要用PreparedStatement(从Statement扩展而来)取代Statement就可以了
 */
@SuppressWarnings ({"all"})
public class Statement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        //演示用户登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入管理员名：");
        String admin_name = scanner.nextLine();// 读取空格
        System.out.println("请输入密码：");
        String admin_pwd = scanner.nextLine();
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String Driver = properties.getProperty("Driver");
        //1.注册驱动
        Class.forName(Driver);
        //2.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.获取statement
        Statement statement = connection.createStatement();
        //4.执行查询
        String sql = "select * from admin where `name` = '" +
                        admin_name + "'and pwd ='" + admin_pwd + "'";
        ResultSet resultSet = statement.executeQuery(sql);
        if(resultSet.next()){//查询到至少一条记录
            System.out.println("登录成功！");
        }else{
            System.out.println("登录失败！");
        }
        /* 没有输入正确的管理员名和密码但登录成功
         * 请输入管理员名：
         * 1' or
         * 请输入密码：
         * OR '1' = '1
         * 登录成功！
         *
         * 进程已结束，退出代码为 0
         */

        //关闭资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}
